// 引入文件路径处理库
import path from "path";
// 引入Vite配置相关函数
import { defineConfig, loadEnv } from "vite";
// 引入插件创建函数
import { createVitePlugins } from "./build/vite/plugins";
// 引入代理配置创建函数
import { createViteProxy } from "./build/vite/proxy";
// 引入包信息
import { format } from "date-fns";
import pkg from "./package.json";

// 解构包信息中的依赖项、开发依赖项、应用名称和版本号
const { dependencies, devDependencies, name, version } = pkg;

// 定义应用信息对象，包含包信息和最近构建时间
const __APP_INFO__ = {
    pkg: { dependencies, devDependencies, name, version },
    lastBuildTime: format(new Date(), "yyyy-MM-dd HH:mm:ss"),
};

// 定义Vite配置函数
// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
    // 判断是否为构建命令
    const isBuild = command === "build";
    // 根据环境加载配置
    const viteEnv = loadEnv(mode, __dirname, "") as unknown as ImportMetaEnv;
    // 解构环境变量中的相关配置
    const { VITE_PUBLIC_PATH, VITE_PORT, VITE_SOURCE_MAP, VITE_DROP_CONSOLE } = viteEnv;

    // 返回Vite配置对象
    return {
        // 设置公共路径
        base: VITE_PUBLIC_PATH || "/",
        // 设置根目录
        root: process.cwd(),
        // 配置文件路径别名
        resolve: {
            alias: {
                "/@": path.resolve(__dirname, "src"),
                "/#": path.resolve(__dirname, "types"),
                "~": path.resolve(__dirname),
            },
        },
        // 配置插件
        plugins: createVitePlugins(viteEnv, isBuild),
        // 配置服务器
        server: {
            host: true,
            port: VITE_PORT || 3100,
            proxy: createViteProxy(viteEnv, true),
            fs: {
                cachedChecks: false,
            },
        },
        // 配置构建选项
        build: {
            reportCompressedSize: false,
            sourcemap: VITE_SOURCE_MAP,
            chunkSizeWarningLimit: 2000,
            brotliSize: false,
            commonjsOptions: {
                ignoreTryCatch: false,
            },
            esbuild: {
                drop: VITE_DROP_CONSOLE ? ["console", "debugger"] : [],
            },
        },
        // 定义全局变量
        define: {
            __INTLIFY_PROD_DEVTOOLS__: false,
            __APP_INFO__: JSON.stringify(__APP_INFO__),
        },
    };
});
